package com.example.annoationaop.aopannoation;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;
import java.util.Set;

@Component
@Aspect
public class LogAspect {
    /**
     *1.这块的处理在我们实际的开发中还是挺有用的。
     * 比如目前我们项目中用的实现redis的双删策略，就是这么搞的。
     * 在进行某个表中进行删除和修改操作时，需要把对应的key进行删除。同时业务开发人员是无感知的。
     * 因此在进行key的拼装和删除时，都是由aop这块的实现来做的。
     *2.如果日志的相关处理也可以这么弄，比如说需要异步时，我们在after中去往消息中间件中发送一个消息即可。
     */


    @Pointcut("@annotation(com.example.annoationaop.aopannoation.LogAnnotation)")
    public void logAspect(){

    }

    @Before("logAspect()&& @annotation(logAnnotation)")
    public void before(LogAnnotation logAnnotation){
        System.out.println(logAnnotation.type()+"---------"+logAnnotation.value());
    }

    @After("logAspect()&& @annotation(logAnnotation)")
    public void after(LogAnnotation logAnnotation){
        System.out.println(logAnnotation.type()+"---------"+logAnnotation.value());
    }
}
